package com.yytek.nmp.service;

import java.util.List;
import java.util.Map;

import com.yytek.common.core.web.domain.AjaxResult;
import com.yytek.nmp.domain.IotDeviceInfo;
import com.yytek.common.core.domain.DeviceCache;
import com.yytek.nmp.dto.DeviceServiceInvoke;

/**
 * 设备管理Service接口
 * 
 * @author yytek-iot
 * @date 2022-07-05
 */
public interface IIotDeviceInfoService 
{
    /**
     * 查询设备管理
     * 
     * @param iotId 设备管理主键
     * @return 设备管理
     */
    public IotDeviceInfo selectIotDeviceInfoByIotId(String iotId);

    /**
     * 查询设备管理列表
     * 
     * @param iotDeviceInfo 设备管理
     * @return 设备管理集合
     */
    public List<IotDeviceInfo> selectIotDeviceInfoList(IotDeviceInfo iotDeviceInfo);

    /**
     * 新增设备管理
     * 
     * @param iotDeviceInfo 设备管理
     * @return 结果
     */
    public int insertIotDeviceInfo(IotDeviceInfo iotDeviceInfo);

    /**
     * 修改设备管理
     * 
     * @param iotDeviceInfo 设备管理
     * @return 结果
     */
    public int updateIotDeviceInfo(IotDeviceInfo iotDeviceInfo);

    /**
     * 批量删除设备管理
     * 
     * @param iotIds 需要删除的设备管理主键集合
     * @return 结果
     */
    public int deleteIotDeviceInfoByIotIds(String[] iotIds);

    /**
     * 删除设备管理信息
     * 
     * @param iotId 设备管理主键
     * @return 结果
     */
    public int deleteIotDeviceInfoByIotId(String iotId);

    /**
     * 判断是否项目下存在设备
     * @param id 项目id
     * @return true存在,false不存在
     */
    boolean isExistsDeviceByProjectId(Long id);

    /**
     * 新增插入设备
     * @param iotDeviceInfo
     * @return
     */
    AjaxResult insertDevice(IotDeviceInfo iotDeviceInfo);

    /**
     * 删除设备信息
     * @param iotIds
     * @return
     */
    AjaxResult deleteDeviceByIds(String iotIds);

    /**
     * 查询自有项目的设备列表
     * @param iotDeviceInfo
     * @param userId
     * @return
     */
    List<IotDeviceInfo> selectDeviceInfoMyList(IotDeviceInfo iotDeviceInfo, String userId);

    /**
     * 查询授权项目的设备列表
     * @param iotDeviceInfo
     * @return
     */
    List<IotDeviceInfo> selectDeviceInfoAuthList(IotDeviceInfo iotDeviceInfo,String userId);

    /**
     * 获取设备的最新属性
     * @param id
     * @return
     */
    List<Map<String, Object>> getPropertiesByIotId(String id);

    /**
     * 查询网关设备的子设备
     * @param id
     * @return
     */
    List<IotDeviceInfo> getTopoDevice(String id);

    /**
     * 查询网关没有绑定的子设备列表
     * @param id
     * @return
     */
    List<IotDeviceInfo> getNoBindTopoDevice(String id);

    /**
     * 网关绑定子设备
     * @param gateWayid
     * @param subId
     * @return
     */
    int bindTopoDevice(String gateWayid, String subId);

    /**
     * 网关解绑子设备
     * @param gateWayid
     * @param subId
     * @return
     */
    int noBindTopoDevice(String gateWayid, String subId);


    /**
     * 查询设备相关缓存信息
     * @param id
     * @return
     */
    DeviceCache getDeviceCacheByIotId(String id);

    /**
     * 查询设备的历史实时属性数据
     *
     * @param id
     * @param startTime
     * @param endTime
     * @return
     */
    List<Map<String, Object>> getHisProperties(String id, String startTime, String endTime);

    /**
     * 发送设备升级信息
     * @param iotId
     * @param upgradeStrategyId
     */
    void sendDeviceUpgradeMsg(String iotId, String upgradeStrategyId);

    /**
     * 设备服务调用
     * @param deviceServiceInvoke
     */
    void invokeDeviceService(DeviceServiceInvoke deviceServiceInvoke);
}
